package com.hyts.callcenter.telnet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;

/***
 * This is a utility class providing a reader/writer capability required by the
 * weatherTelnet, rexec, rshell, and rlogin example programs. The only point of
 * the class is to hold the static method readWrite which spawns a reader thread
 * and a writer thread. The reader thread reads from a local input source
 * (presumably stdin) and writes the data to a remote output destination. The
 * writer thread reads from a remote input source and writes to a local output
 * destination. The threads terminate when the remote input source closes.
 ***/

public final class IOUtil {

	public static final void readWrite(final InputStream remoteInput, final OutputStream remoteOutput,
			final InputStream localInput, final Writer localOutput) {
		Thread reader, writer;

		reader = new Thread() {
			@Override
			public void run() {
				int ch;

				try {
					while (!interrupted() && (ch = localInput.read()) != -1) {
						remoteOutput.write(ch);
						remoteOutput.flush();
					}
				} catch (IOException e) {
					// e.printStackTrace();
				}
			}
		};

		writer = new Thread() {
			@Override
			public void run() {
				try {
					while (true) {
						int singleByte = remoteInput.read();
						if (singleByte < 0) {
							break;
						}
						localOutput.write(singleByte);
						localOutput.flush();
					}
				} catch (IOException e) {
					e.printStackTrace();
					System.exit(1);
				}
			}
		};

		writer.setPriority(Thread.currentThread().getPriority() + 1);

		writer.start();
		reader.setDaemon(true);
		reader.start();

		try {
			writer.join();
			reader.interrupt();
		} catch (InterruptedException e) {
			// Ignored
		}
	}

}